跳到主要内容

Go 的 常用命令

如果忘记哪个命令使用了可以使用 go help [command] 去看它的文档,这里就记录一些常用的命令

go build 编译命令

go build [-o output] [-i] [build flags] [packages]

它可以启动编译,把我们的包和相关的依赖编译成一个可执行的文件。

go build

go build .

go build hello.go

以上这三种写法,都是使用当前目录编译的意思。

因为我们忽略了 packages,所以自然就使用当前目录进行编译了。从这里我们也可以推测出,go build 本质上需要的是一个路径,让编译器可以找到哪些需要编译的 go 文件。

packages 其实是一个相对路径,是相对于我们定义的 GOROOT 和 GOPATH 这两个环境变量的,所以有了 packages 这个参数后,go build 就可以知道哪些需要编译的 go 文件了。

go build example.org/tools

这种方式是指定包的方式,这样会明确的编译我们这个包。当然我们也可以使用通配符。

go build example.org/tools/...

3 个点表示匹配所有字符串,这样 go build 就会编译 tools 目录下的所有包。

go clean 清除命令

使用 go build 编译的时候,会产生编译生成的文件,使用这个命令它可以清理我们编译生成的文件,比如生成的可执行文件,生成 obj 对象等等。

go clean [-i] [-r] [-n] [-x] [build flags] [packages]

用法和 go build 基本一样

go run 编译运行

go build 是先编译,然后我们在执行可以执行文件来运行我们的程序,需要两步。go run 这个命令就是可以把这两步合成一步的命令,节省了我们录入的时间,通过 go run 命令,我们可以直接看到输出的结果。

在运行 go run 的时候,如果需要的话,我们可以给我们的程序传递参数,比如:

package main

import (
"fmt"
"os"
)


func main() {
fmt.Println("输入的参数为:",os.Args[1])
}

打开终端,输入如下命令执行:

go run main.go 12

go install 打包到库中

这个命令和 Maven 的 mvn install 是一样的

go install 命令在编译源代码之后还安装到指定的目录,即:go build 命令 + 把编译后的可执行文件放到 GOPATH/bin 目录下

它的用法和 go build 差不多,如果不指定一个包名,就使用当前目录。安装的目录都是约定好的,如果生成的是可执行文件,那么安装在 $GOPATH/bin 目录下;如果是可引用的库,那么安装在 $GOPATH/pkg 目录下。

go get 下载依赖

go get 命令,可以从网上下载更新指定的包以及依赖的包,并对它们进行编译和安装。

go get github.com/spf13/cobra

以上示例,我们就可以从 github 上直接下载这个 go 库到我们 GOPATH 工作空间中,以供我们使用。下载的是整个源代码工程,并且会根据它们编译和安装,和执行 go install 类似。

如果我们需要更新网络上的一个 go 工程,加 -u 标记即可。

go get -u github.com/spf13/cobra

go test 单元测试

该命令用于 Go 的单元测试,它也是接受一个包名作为参数,如果没有指定,使用当前目录。 go test 运行的单元测试必须符合 go 的测试要求。

  • 写有单元测试的文件名,必须以 _test.go 结尾。
  • 测试文件要包含若干个测试函数。
  • 这些测试函数要以 Test 为前缀,还要接收一个 *testing.T 类型的参数。
package main

import "testing"

func TestAdd(t *testing.T) {
if Add(1,2) == 3 {
t.Log("1+2=3")
}

if Add(1,1) == 3 {
t.Error("1+1=3")
}
}

这是一个单元测试,保存在 main_test.go 文件中,对 main 包里的 Add(a,b int) 函数进行单元测试。 如果要运行这个单元测试,在该文件目录下,执行 go test 即可。

单元测试常用参数

这里介绍几个常用的参数: -bench regexp 执行相应的 benchmarks,例如 -bench=.; -cover 开启测试覆盖率; -run regexp 只运行 regexp 匹配的函数,例如 -run=Array 那么就执行包含有 Array 开头的函数;

测试代码覆盖率方法

编写一个单元测试

func Test_StartMain(t *testing.T) {
main()
}

运行命令

go test -coverpkg="./..." -c -o cover.test
./cover.test -test.run "Test_StartMain" -test.coverprofile=cover.out
go tool cover -html cover.out -o cover.html

生成如下内容

image.png

这时可以点开这个 html

go mod 模块管理命令

  • go mod download 下载 go.mod 中的模块到本地缓存,缓存路径是 $GOPATH/pkg/mod/cache
  • go mod edit 是提供了命令版编辑 go.mod 的功能,例如 go mod edit -fmt go.mod 会格式化 go.mod
  • go mod graph 把模块之间的依赖图显示出来
  • go mod init 初始化模块(例如把原本 dep 管理的依赖关系转换过来),注意要在 init 后面加上项目名
  • go mod tidy 增加缺失的包,移除没用的包
  • go mod vendor 把依赖拷贝到 vendor/ 目录下
  • go mod verify 确认依赖关系
  • go mod why 解释为什么需要包和模块

显示依赖图可以直接使用 GoLand 提供的工具(就像 IDEA 那样的)

go generate 分析注释命令

这个命令是从 Go1.4 开始才设计的,通过分析源码中特殊的注释,然后执行相应的命令。

这个 go generate 是给你用的,不是给使用你这个包的人用的,是方便你来生成一些代码的。

如果我们想让 go generate 来触发命令,那么就可以在当前目录的任意一个 xxx.go 文件里面的任意位置增加一行如下的注释:

//go:generate go tool yacc -o gopher.go -p parser gopher.y

这里我们注意了,//go:generate 是没有任何空格的,这其实就是一个固定的格式,在扫描源码文件的时候就是根据这个来判断的。

使用时直接通过

go generate file.go

Reference

Go语言实战笔记(二)| Go开发工具